
package structure;

import java.util.ArrayList;
import java.util.Iterator;

import tableur.Tableur;

/**
 * Traite la sauvegarde de données d'un tableau. Structure de données pour le
 * code fonctionne simplement.
 * 
 * @version 1.0 - 31 octobre 2008 (Robert Aubé)
 * @version 1.0 - 31 octobre 2010 (Jocelyn Goulet)
 * @version 1.1 - 06 novembre 2011 (David Bernard)
 * @since java 1.6
 * @see AbstractDataCenter
 */
public class TabDataCenter extends AbstractDataCenter
{
	private Object[][] table = null;
	private int nbElement = 0;

	/**
	 * Instancie un DataCenter basé sur une matrice.
	 */
	public TabDataCenter()
	{
		this.table = TabDataCenter.buildMatrix();
	}

	@Override
	public void removeAllData()
	{
		this.table = TabDataCenter.buildMatrix();
		this.nbElement = 0;
		System.gc();
	}

	@Override
	public Iterator<DataNode> iterator()
	{
		ArrayList<DataNode> list = new ArrayList<DataNode>();
		Object buffer = null;
		boolean flag = true;

		for (int i = 0; flag && (i < this.table.length); i++)
		{
			for (int j = 0; flag && (j < this.table[i].length); j++)
			{
				buffer = this.table[i][j];

				if (buffer != null)
				{
					list.add(new DataNode(i, j, buffer));

					if (list.size() == this.size())
					{
						flag = false;
					}
				}
			}
		}

		return list.listIterator();
	}

	@Override
	public int size()
	{
		return this.nbElement;
	}

	@Override
	protected void setElement(DataNode node)
	{
		int ligne = node.getLigne();
		int colonne = node.getColonne();
		Object o = this.table[ligne][colonne];

		if (o == null)
		{
			this.nbElement++;
		}

		this.table[node.getLigne()][node.getColonne()] = node.getContenu();
	}

	@Override
	protected DataNode getElement(DataKey cle)
	{
		int ligne = cle.getLigne();
		int colonne = cle.getColonne();
		return new DataNode(ligne, colonne, this.table[ligne][colonne]);
	}

	@Override
	protected void removeElement(DataKey cle)
	{
		this.table[cle.getLigne()][cle.getColonne()] = null;
		this.nbElement--;
	}

	private static Object[][] buildMatrix()
	{
		return new Object[Tableur.MAX_COLONNE][Tableur.MAX_LIGNE];
	}
}
